#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

// ">"引出让玩家选择数字1或2，并返回该数字。作出选择后回车两行。
int makeChoice()
{
	int a = 0;
	while (1)
	{
		printf(">");
		scanf("%d", &a);
		if (1 == a || 2 == a)
		{
			printf("\n");
			return a;
		}
		else
			printf("请输入1或2选择。\n\n");
	}
	while (getchar() != '\n');
}

//弹出一局结束画面。选择再玩返回1，否则返回0。
int reStart()
{
	printf("1.再玩一局\n");
	printf("2.返回菜单\n\n");
	if (1 == makeChoice())
		return 1;
	else
		return 0;
}

//菜单：清屏，然后展示开始或结束游戏的选项。开始新游戏返回1，结束进程返回0。
int menu()
{
	system("cls");
	printf("   三子棋\n");
	printf("***1.开始***\n");
	printf("***2.结束***\n\n");

	if (1 == makeChoice())
		return 1;
	else
		return 0;
}

//游戏本体。
void game_0()
{
	//创建并初始化棋子坐标数组。
	int m = 0;
	int n = 0;
	char arr[3][3] = { 0 };
	for (m = 0;m < 3;m++)
		for (n = 0;n < 3;n++)
			arr[m][n] = ' ';

	int x = 0;
	int y = 0;
	int count = 0;
	int over = 0;

	do
	{
		printf("  %c│ %c│ %c\n", arr[0][0], arr[0][1], arr[0][2]);
		printf(" --┼--┼--- \n");
		printf("  %c│ %c│ %c\n", arr[1][0], arr[1][1], arr[1][2]);
		printf(" --┼--┼--- \n");
		printf("  %c│ %c│ %c\n\n", arr[2][0], arr[2][1], arr[2][2]);

		//判断三子连和平局。
		if (count > 4)
		{
			//斜线相等。
			if (arr[0][0] != ' ' && arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] || arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2])
			{
				over = 1;
				printf("游戏结束，%c方获胜。\n\n", count % 2 == 0 ? 'X' : 'O');
				Sleep(2000);
			}
            if (1 != over)
			{
				//行相等。
				int x1 = 0;
				int y1 = 0;
				for (x1 = 0;x1 < 3;x1++)
				{
					if (arr[x1][0] != ' ' && arr[x1][0] == arr[x1][1] && arr[x1][1] == arr[x1][2])
					{
						over = 1;
						printf("游戏结束，%c方获胜。\n\n", count % 2 == 0 ? 'X' : 'O');
						Sleep(1000);
						break;
					}
				}
                //列相等。
                if (1 != over)
                {
                    for (y1 = 0;y1 < 3;y1++)
                    {
                        if (arr[0][y1] != ' ' && arr[0][y1] == arr[1][y1] && arr[1][y1] == arr[2][y1])
                        {
                            over = 1;
                            printf("游戏结束，%c方获胜。\n\n", count % 2 == 0 ? 'X' : 'O');
                            Sleep(1000);
                            break;
                        }
                    }
                }
			}
            if(1 != over && 9 == count)
            {
                over = 1;
                printf("游戏结束，是平局。\n\n");
                Sleep(1000);
            }
		}

		//引导下棋。
		while(1 != over)
		{
			int a = 0;
			int b = 0;
			char next = count % 2 == 0 ? 'O' : 'X';
			while (getchar() != '\n');

			printf(">");
			scanf("%d,%d", &a, &b);
			
			if (a > 0 && a <=3 && b > 0 && b <= 3)
			{
				if (arr[b - 1][a - 1] == 'X' || arr[b - 1][a - 1] == 'O')
					printf("此处已有棋子，请重试。\n\n");
				else
				{
					arr[b - 1][a - 1] = next;
					count++;
					printf("\n");
					break;
				}
			}
			else
				printf("格式错误或超出棋盘，请重试。\n\n");
		}
	}


	while (1 != over);
}

//游戏流程。
void game(int help)
{
	system("cls");
	if (0 == help)
	{
		printf("游戏说明：\n");
		printf("先手棋为O，后手棋为X，交替下棋到3*3的井字格中。\n");
		printf("输入 列数,行数 格式的数对（如 1,2 注意是英文逗号）并按回车以落棋。\n");
		printf("率先三子连成线的一方胜利。\n\n");
		Sleep(1500);
	}
	//新手教程，出现一次。

	while (1)
	{
		game_0();

		if (1 == reStart())
			system("cls");
		else
			break;
	}
}